package com.ruoyi.pos.domain.print;

import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.*;

/**
 * POS打印方案实体类
 * 
 * 用于管理POS系统的打印方案配置，包括小票、银行单据、报表等多种打印模板
 * 支持多种纸张尺寸和打印格式的配置
 * 
 * @author POS System
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class PosPrintScheme extends BaseEntity {
    
    private static final long serialVersionUID = 1L;

    /**
     * 方案ID（主键）
     */
    private Long schemeId;

    /**
     * 方案编码
     */
    @Excel(name = "方案编码")
    @NotBlank(message = "方案编码不能为空")
    @Size(max = 50, message = "方案编码长度不能超过50个字符")
    private String schemeCode;

    /**
     * 方案名称
     */
    @Excel(name = "方案名称")
    @NotBlank(message = "方案名称不能为空")
    @Size(max = 100, message = "方案名称长度不能超过100个字符")
    private String schemeName;

    /**
     * 方案类型
     */
    @Excel(name = "方案类型", readConverterExp = "RECEIPT=小票,BANK_SLIP=银行单据,REPORT=报表")
    @NotBlank(message = "方案类型不能为空")
    private String schemeType;

    /**
     * 模板内容
     */
    private String templateContent;

    /**
     * 模板类型
     */
    @Excel(name = "模板类型", readConverterExp = "TEXT=纯文本,HTML=HTML格式,JSON=JSON格式")
    @NotBlank(message = "模板类型不能为空")
    private String templateType;

    /**
     * 纸张宽度(mm)
     */
    @Excel(name = "纸张宽度(mm)")
    @Min(value = 1, message = "纸张宽度必须大于0")
    private Integer paperWidth;

    /**
     * 字体大小
     */
    @Excel(name = "字体大小")
    @Min(value = 1, message = "字体大小必须大于0")
    private Integer fontSize;

    /**
     * 字体
     */
    @Excel(name = "字体")
    @Size(max = 50, message = "字体名称长度不能超过50个字符")
    private String fontFamily;

    /**
     * 行间距
     */
    @Excel(name = "行间距")
    @Min(value = 1, message = "行间距必须大于0")
    private Integer lineSpacing;

    /**
     * 左边距(mm)
     */
    @Excel(name = "左边距(mm)")
    @Min(value = 0, message = "左边距不能小于0")
    private Integer marginLeft;

    /**
     * 右边距(mm)
     */
    @Excel(name = "右边距(mm)")
    @Min(value = 0, message = "右边距不能小于0")
    private Integer marginRight;

    /**
     * 上边距(mm)
     */
    @Excel(name = "上边距(mm)")
    @Min(value = 0, message = "上边距不能小于0")
    private Integer marginTop;

    /**
     * 下边距(mm)
     */
    @Excel(name = "下边距(mm)")
    @Min(value = 0, message = "下边距不能小于0")
    private Integer marginBottom;

    /**
     * 页眉模板
     */
    private String headerTemplate;

    /**
     * 页脚模板
     */
    private String footerTemplate;

    /**
     * LOGO地址
     */
    @Excel(name = "LOGO地址")
    @Size(max = 200, message = "LOGO地址长度不能超过200个字符")
    private String logoUrl;

    /**
     * LOGO宽度
     */
    @Excel(name = "LOGO宽度")
    @Min(value = 1, message = "LOGO宽度必须大于0")
    private Integer logoWidth;

    /**
     * LOGO高度
     */
    @Excel(name = "LOGO高度")
    @Min(value = 1, message = "LOGO高度必须大于0")
    private Integer logoHeight;

    /**
     * 是否显示二维码
     */
    @Excel(name = "是否显示二维码", readConverterExp = "0=否,1=是")
    private String qrCodeEnabled;

    /**
     * 二维码大小
     */
    @Excel(name = "二维码大小")
    @Min(value = 1, message = "二维码大小必须大于0")
    private Integer qrCodeSize;

    /**
     * 预览图片(Base64)
     */
    private String previewImage;

    /**
     * 是否默认方案
     */
    @Excel(name = "是否默认方案", readConverterExp = "0=否,1=是")
    private String isDefault;

    /**
     * 状态
     */
    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
    private String status;

    /**
     * 排序
     */
    @Excel(name = "排序")
    @Min(value = 0, message = "排序不能小于0")
    private Integer sortOrder;

    // ==================== 业务方法 ====================

    /**
     * 获取方案类型显示名称
     */
    public String getSchemeTypeDisplay() {
        if (schemeType == null) {
            return "未知";
        }
        switch (schemeType) {
            case "RECEIPT":
                return "小票";
            case "BANK_SLIP":
                return "银行单据";
            case "REPORT":
                return "报表";
            default:
                return "未知类型";
        }
    }

    /**
     * 获取模板类型显示名称
     */
    public String getTemplateTypeDisplay() {
        if (templateType == null) {
            return "未知";
        }
        switch (templateType) {
            case "TEXT":
                return "纯文本";
            case "HTML":
                return "HTML格式";
            case "JSON":
                return "JSON格式";
            default:
                return "未知格式";
        }
    }

    /**
     * 获取状态显示名称
     */
    public String getStatusDisplay() {
        if (status == null) {
            return "未知";
        }
        switch (status) {
            case "0":
                return "正常";
            case "1":
                return "停用";
            default:
                return "未知状态";
        }
    }

    /**
     * 判断是否为正常状态
     */
    public boolean isNormal() {
        return "0".equals(status);
    }

    /**
     * 判断是否为默认方案
     */
    public boolean isDefaultScheme() {
        return "1".equals(isDefault);
    }

    /**
     * 判断是否显示二维码
     */
    public boolean isQrCodeShow() {
        return "1".equals(qrCodeEnabled);
    }

    /**
     * 判断是否为小票方案
     */
    public boolean isReceiptScheme() {
        return "RECEIPT".equals(schemeType);
    }

    /**
     * 判断是否为银行单据方案
     */
    public boolean isBankSlipScheme() {
        return "BANK_SLIP".equals(schemeType);
    }

    /**
     * 判断是否为报表方案
     */
    public boolean isReportScheme() {
        return "REPORT".equals(schemeType);
    }

    /**
     * 获取纸张宽度描述
     */
    public String getPaperWidthDescription() {
        if (paperWidth == null) {
            return "未设置";
        }
        
        switch (paperWidth) {
            case 58:
                return "58mm (热敏小票)";
            case 80:
                return "80mm (标准小票)";
            case 210:
                return "210mm (A4纸张)";
            default:
                return paperWidth + "mm";
        }
    }

    /**
     * 获取边距描述
     */
    public String getMarginsDescription() {
        StringBuilder margins = new StringBuilder();
        
        if (marginTop != null) {
            margins.append("上:").append(marginTop).append("mm ");
        }
        if (marginBottom != null) {
            margins.append("下:").append(marginBottom).append("mm ");
        }
        if (marginLeft != null) {
            margins.append("左:").append(marginLeft).append("mm ");
        }
        if (marginRight != null) {
            margins.append("右:").append(marginRight).append("mm");
        }
        
        return margins.toString().trim();
    }

    /**
     * 获取LOGO尺寸描述
     */
    public String getLogoSizeDescription() {
        if (logoWidth == null || logoHeight == null) {
            return "未设置";
        }
        return logoWidth + "×" + logoHeight;
    }

    /**
     * 判断是否有LOGO
     */
    public boolean hasLogo() {
        return logoUrl != null && !logoUrl.trim().isEmpty();
    }

    /**
     * 判断是否有预览图
     */
    public boolean hasPreviewImage() {
        return previewImage != null && !previewImage.trim().isEmpty();
    }

    /**
     * 验证模板内容
     */
    public boolean validateTemplateContent() {
        if (templateContent == null || templateContent.trim().isEmpty()) {
            return false;
        }
        
        // 根据模板类型进行不同的验证
        switch (templateType) {
            case "JSON":
                try {
                    // 简单JSON格式验证
                    return templateContent.trim().startsWith("{") && 
                           templateContent.trim().endsWith("}");
                } catch (Exception e) {
                    return false;
                }
            case "HTML":
                // HTML格式验证
                return templateContent.contains("<") && templateContent.contains(">");
            case "TEXT":
            default:
                // 文本格式无需特殊验证
                return true;
        }
    }

    // ==================== 备用扩展字段 ====================
    
    /**
     * 备用字段1
     */
    private String reserved1;

    /**
     * 备用字段2
     */
    private String reserved2;

    /**
     * 备用字段3
     */
    private String reserved3;

    /**
     * 备用字段4
     */
    private String reserved4;

    /**
     * 备用字段5
     */
    private String reserved5;
}

